(function () {

    /**
     * 一、类型不明确时，使用泛型。调用时定义类型。
     */
    function fn<T>(a: T): T {
        return a
    }

    // 自动对类型进行推断
    fn(10)
    // 指定泛型
    fn<string>('hello')


    /**
     * 二、多个泛型
     */
    function fn2<T, K>(a: T, b: K) {
        console.log(b)
        return a
    }

    fn2(10, 'hello')
    fn2<number, string>(123, '456')



    /**
     * 三、接口 - 泛型
     */
    interface Inter {
        length: number
    }

    function fn3<T extends Inter>(a: T): number {
        return a.length
    }
    // fn3(123) // 数字没有length属性
    fn3('123') // 字符串有length属性
    fn3({ name: "xxx", length: 10 })// 对象包含length属性


    /**
     * 四、类 - 泛型
     */
    class MyClass<T> {
        name: T
        constructor(name: T) {
            this.name = name
        }
    }

    // 调用MyClass时，指定类型
    const c = new MyClass<string>('张三')
    console.log(c)

})();
